﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entidades;
using LogicaNegocio;
using AccesoBD;

namespace PresentacionEscritorio
{
    public partial class frmGestionTurnos2 : Form, IFormsPadre_Hijo, IListadoOrdenLLegada
    {
        public int estadoTurnoSeleccionado { get; set; }
        private List<EstadoTurno> listaEstadosTurno;
        private List<Consultorio> listaConsultorios;
        private List<ItemListadoOrdenLlegada> lsI;
        private frmCobroAtencionMédica formCobroAtencion;
        private long idTurnoSeleccionado;
        private int nroFilaTurnoSeleccionado;
        private int nroColumnaSeleccionado;
        private long nroHCturno;
        private long idItemOLL;


        private long[,] matrizIdTurnos;
        private long[,] matrizIdTurnosSemana;

        public CajaDiaria miCaja { get; set; }

        enum OpcionAgenda
        {
            Hoy,
            Semana
        }
        private OpcionAgenda opElegida;

        enum FormsHijo
        {
            asignarTurno,
            registrarCobro,
            registrarLlegada,
        }
        private FormsHijo myFormHijoActual;

        public frmGestionTurnos2()
        {
            InitializeComponent();
        }

        private void frmGestionTurnos2_Load(object sender, EventArgs e)
        {
            listaEstadosTurno = GestorAgendaTurnos.obtenerEstadosTurno();
            listaConsultorios = GestorAgendaTurnos.obtenerConsultorios();
            opElegida = OpcionAgenda.Hoy;
            rdbAgendaHoy.Checked = true;
            panelBusqueda.Enabled = false;
            cargarGrilla(opElegida);
            timer1.Start();
            //cargamos los combos
            cargarComboEspecialidadesPorTurno();
            cargarComboEspecialidadesPorOrdenLlegada();

        }

        #region TabTurnos
        #region cargarGrilla
        private void cargarGrilla(OpcionAgenda op)
        {
            switch (op)
            {
                case OpcionAgenda.Hoy:
                    cargarGrillaHoy();
                    break;
                case OpcionAgenda.Semana:
                    //cargarGrillaSemana();
                    break;
            }

        }

        private void cargarGrillaSemana(int codEsp, long legajo, DateTime fechaDesde)
        {
            TimeSpan horaInicio;

            //limpiamos grilla
            if (grdAgenda.RowCount > 0)
                grdAgenda.Rows.Clear();
            if (grdAgenda.ColumnCount > 0)
                grdAgenda.Columns.Clear();

            //agregamos las columnas que necesitamos
            DataGridViewTextBoxColumn hora = new DataGridViewTextBoxColumn();
            hora.Name = "Hora";
            hora.HeaderText = "Hora/Dia";
            grdAgenda.Columns.Add(hora);

            //habria que buscar los consultorios y agregarlos, pero bue
            grdAgenda.Columns.Add("Lunes", "Lunes");
            grdAgenda.Columns.Add("Martes", "Martes");
            grdAgenda.Columns.Add("Miercoles", "Miércoles");
            grdAgenda.Columns.Add("Jueves", "Jueves");
            grdAgenda.Columns.Add("Viernes", "Viernes");

            //vemos segun la hora que turno es, y le cargamos la hora de incio y fin
            TimeSpan horaInicioMañana = new TimeSpan(08, 00, 00);
            TimeSpan horaFinTarde = new TimeSpan(20, 00, 00);

            //carga los dos turnos
            horaInicio = horaInicioMañana;
            TimeSpan duracionTurno = new TimeSpan(0, 30, 0);
            int index = 0;
            while (true)
            {
                grdAgenda.Rows.Add();
                if (index == 0)
                    grdAgenda.Rows[index].Cells[0].Value = horaInicio.ToString();
                else
                {
                    horaInicio = horaInicio + duracionTurno;
                    grdAgenda.Rows[index].Cells[0].Value = horaInicio.ToString();
                }
                if (horaInicio.Hours < horaFinTarde.Hours)
                    index++;
                else
                    break;
            }

            int cantFilas = grdAgenda.RowCount;
            grdAgenda.RowsDefaultCellStyle.BackColor = Color.LightGray;  //por defecto todo es No disponible

            for (int i = 0; i < cantFilas; i++) //cargamos las celdas que indican la hora
            {
                grdAgenda.Rows[i].Cells[0].Style.BackColor = Color.DimGray; //celdas de hora
                grdAgenda.Rows[i].Cells[0].Style.ForeColor = Color.White;
                grdAgenda.Rows[i].Cells[0].ReadOnly = true;
            }

            //ahora que esta la grilla completa, puedo saber el tamaño de la matriz
            matrizIdTurnosSemana = new long[grdAgenda.RowCount, grdAgenda.ColumnCount];

            buscarTurnosSemana(fechaDesde, codEsp, legajo);
        }

        private void buscarTurnosSemana(DateTime fechaDesde, int codEsp, long legMed)
        {
            List<Turno> listaTurnosSemana = GestorAgendaTurnos.obtenerTurnosSemana(fechaDesde, codEsp, legMed);

            //cargamos los turnos de acuerdo a su dia de la semana
            foreach (Turno item in listaTurnosSemana)
            {
                int nroColumna = -1; //me indicara el nro de columna
                switch (item.FechaTurno.DayOfWeek)
                {
                    case DayOfWeek.Friday:
                        nroColumna = 5;
                        break;
                    case DayOfWeek.Monday:
                        nroColumna = 1;
                        break;
                    case DayOfWeek.Thursday:
                        nroColumna = 4;
                        break;
                    case DayOfWeek.Tuesday:
                        nroColumna = 2;
                        break;
                    case DayOfWeek.Wednesday:
                        nroColumna = 3;
                        break;
                }

                for (int i = 0; i < grdAgenda.Rows.Count; i++)
                {
                    TimeSpan horaCelda = TimeSpan.Parse(grdAgenda.Rows[i].Cells[0].Value.ToString());
                    if (item.HoraTurno == horaCelda)
                    {
                        matrizIdTurnosSemana[i, nroColumna] = item.IdTurno; //guardamos el id de turno de la celda
                        //validamos el estado del turno
                        switch (item.IdEstadoTurno)
                        {
                            case 1: //disponible
                                grdAgenda.Rows[i].Cells[nroColumna].Style.BackColor = Color.White;
                                grdAgenda.Rows[i].Cells[nroColumna].Value = item.HoraTurno;
                                break;
                            case 2: //asignado
                                grdAgenda.Rows[i].Cells[nroColumna].Style.BackColor = Color.Orange;
                                grdAgenda.Rows[i].Cells[nroColumna].Value = item.HoraTurno + " " + item.NombrePaciente;
                                break;
                        }
                    }
                }//fin for
            }//fin foreach
        }


        private void cargarGrillaHoy()
        {
            //limpiamos grilla
            if (grdAgenda.RowCount > 0)
                grdAgenda.Rows.Clear();
            if (grdAgenda.ColumnCount > 0)
                grdAgenda.Columns.Clear();

            //1° creamos las columnas
            grdAgenda.Columns.Add("Hora/Consultorio", "Hora/Consultorio");
            for (int i = 0; i < listaConsultorios.Count; i++)
            {
                string nombreColumna = listaConsultorios[i].IdConsultorio.ToString();
                string headerColumna = listaConsultorios[i].Nombre;

                grdAgenda.Columns.Add(nombreColumna, headerColumna);
            }


            //2° seteamos la franja horaria
            TimeSpan horaInicioMañana = new TimeSpan(08, 0, 0);
            TimeSpan horaCierreMañana = new TimeSpan(13, 0, 0);
            TimeSpan horaInicioTarde = new TimeSpan(16, 0, 0);
            TimeSpan horaCierreTarde = new TimeSpan(21, 0, 0);

            TimeSpan horaInicio;
            TimeSpan duracionCelda = new TimeSpan(0, 30, 0);

            bool esMañana = false;

            if (DateTime.Now.TimeOfDay >= horaInicioMañana && DateTime.Now.TimeOfDay <= horaCierreMañana)//(DateTime.Now.TimeOfDay <= horaInicioMañana)//
            {
                //muestro turno mañana, cargando filas vacias
                esMañana = true;
                horaInicio = horaInicioMañana;
                while (horaInicio <= horaCierreMañana)
                {
                    int nroFila = grdAgenda.Rows.Add();
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Value = horaInicio.ToString();
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Style.BackColor = Color.DimGray;

                    //empieza por la 2da columna
                    for (int i = 1; i < grdAgenda.ColumnCount; i++)
                    {
                        grdAgenda.Rows[nroFila].Cells[i].Style.BackColor = Color.LightGray; //no disponible por defecto
                    }

                    //sumamos
                    horaInicio = horaInicio.Add(duracionCelda);
                }

            }
            else
            {
                //if (DateTime.Now.TimeOfDay > horaCierreMañana && DateTime.Now.TimeOfDay <= horaCierreTarde)
                //{
                //muestro turno tarde
                horaInicio = horaInicioTarde;
                while (horaInicio <= horaCierreTarde)
                {
                    int nroFila = grdAgenda.Rows.Add();
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Value = horaInicio;
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Style.BackColor = Color.DimGray;

                    //empieza por la 2da columna
                    for (int i = 1; i < grdAgenda.ColumnCount; i++)
                    {
                        grdAgenda.Rows[nroFila].Cells[i].Style.BackColor = Color.LightGray; //no disponible por defecto
                    }

                    //sumamos
                    horaInicio = horaInicio.Add(duracionCelda);
                }
            }
            //} //fin if

            //ahora que esta la grilla completa, puedo saber el tamaño de la matriz
            matrizIdTurnos = new long[grdAgenda.RowCount, grdAgenda.ColumnCount];



            //3° traemos los turnos del dia
            //DateTime fechaAbuscar = DateTime.Now();
            DateTime fechaAbuscar = new DateTime(2014, 11, 18);

            //OBTENER DIA DE LA SEMANA
            int nroDia = 0;
            switch (fechaAbuscar.DayOfWeek)
            {
                case DayOfWeek.Friday:
                    nroDia = 6;
                    break;
                case DayOfWeek.Monday:
                    nroDia = 2;
                    break;
                case DayOfWeek.Saturday:
                    nroDia = 7;
                    break;
                case DayOfWeek.Sunday:
                    nroDia = 1;
                    break;
                case DayOfWeek.Thursday:
                    nroDia = 5;
                    break;
                case DayOfWeek.Tuesday:
                    nroDia = 3;
                    break;
                case DayOfWeek.Wednesday:
                    nroDia = 4;
                    break;
            }

            //vemos si es turno mañana o tarde y de acuerdo a eso traemos esos turnos solamente
            List<Turno> listaTurnosDia;
            List<EspecialidadMedico> listaEspecialidadesDia;
            if (esMañana)
            {
                listaTurnosDia = GestorAgendaTurnos.obtenerTurnosPorFechaManiana(fechaAbuscar);
                listaEspecialidadesDia = GestorAgendaTurnos.obtenerEspecialidadesMedicoFecha2Maniana(fechaAbuscar, nroDia);
            }
            else
            {
                listaTurnosDia = GestorAgendaTurnos.obtenerTurnosPorFechaTarde(fechaAbuscar);
                listaEspecialidadesDia = GestorAgendaTurnos.obtenerEspecialidadesMedicoFecha2Tarde(fechaAbuscar, nroDia);
            }

            //actualizamos los headers de las columnas con las especialidades y sus medicos - segun turno horario
            foreach (EspecialidadMedico item in listaEspecialidadesDia)
            {
                grdAgenda.Columns[item.idConsultorioPorDiaBuscado].HeaderText += "\n\r" + item.Especialidad.Nombre + "\n\r" + item.Medico.ApellidoNombre;
            }

            Turno t;
            if (esMañana)
            {
                //busca los turnos a la mañana
                foreach (Turno item in listaTurnosDia)
                {
                    if (item.HoraTurno >= horaInicioMañana && item.HoraTurno <= horaCierreMañana)
                    {
                        //cargo a la grilla
                        foreach (EspecialidadMedico espMed in listaEspecialidadesDia)
                        {
                            if (espMed.CodEspecialidad == item.IdEspecialidad && espMed.LegajoMedico == item.LegajoMedico)
                            {
                                item.duracionturno = new TimeSpan(0, espMed.duracionAtencion, 0);
                                string numeroColumna = espMed.idConsultorioPorDiaBuscado.ToString();
                                for (int i = 0; i < grdAgenda.Rows.Count; i++)
                                {
                                    TimeSpan horaCelda = TimeSpan.Parse(grdAgenda.Rows[i].Cells[0].Value.ToString());
                                    if (item.HoraTurno == horaCelda)
                                    {
                                        matrizIdTurnos[i, espMed.idConsultorioPorDiaBuscado] = item.IdTurno; //guardamos el id de turno de la celda
                                        //validamos el estado del turno
                                        switch (item.IdEstadoTurno)
                                        {
                                            case 1: //disponible
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.White;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno;
                                                break;
                                            case 2: //asignado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Orange;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 3: //asistido no cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Chocolate;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 4: //asistido cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.LightCoral;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 5: //atendido no cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.YellowGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 6: //atendido cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.SeaGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 7: //no asistido
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.DarkGray;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;

                                        } //fin switch
                                    }//fin if hora celda
                                }
                            }
                        }
                    }

                }
            }
            else
            {
                //busca los turnos a la tarde
                foreach (Turno item in listaTurnosDia)
                {
                    if (item.HoraTurno >= horaInicioTarde && item.HoraTurno <= horaCierreTarde)
                    {
                        //cargo a la grilla
                        foreach (EspecialidadMedico espMed in listaEspecialidadesDia)
                        {
                            if (espMed.CodEspecialidad == item.IdEspecialidad && espMed.LegajoMedico == item.LegajoMedico)
                            {
                                item.duracionturno = new TimeSpan(0, espMed.duracionAtencion, 0);
                                string numeroColumna = espMed.idConsultorioPorDiaBuscado.ToString();
                                for (int i = 0; i < grdAgenda.Rows.Count; i++)
                                {
                                    TimeSpan horaCelda = TimeSpan.Parse(grdAgenda.Rows[i].Cells[0].Value.ToString());
                                    if (item.HoraTurno == horaCelda)
                                    {
                                        matrizIdTurnos[i, espMed.idConsultorioPorDiaBuscado] = item.IdTurno; //guardamos el id de turno de la celda
                                        //validamos el estado del turno
                                        switch (item.IdEstadoTurno)
                                        {
                                            case 1: //disponible
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.White;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno;
                                                break;
                                            case 2: //asignado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Orange;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 3: //asistido no cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Chocolate;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 4: //asistido cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.LightCoral;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 5: //atendido no cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.YellowGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 6: //atendido cobrado
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.SeaGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;
                                            case 7: //no asistido
                                                //buscamos el nombre del paciente
                                                t = GestorAgendaTurnos.obtenerPacienteTurno(item);
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.DarkGray;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno + " " + t.NombrePaciente;
                                                break;

                                        } //fin switch
                                    }
                                }
                            }
                        }

                    }
                }
            }


        }
        #endregion

        #region radioButton
        private void rdbAgendaHoy_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbAgendaHoy.Checked)
            {
                panelBusqueda.Enabled = false;
                opElegida = OpcionAgenda.Hoy;
                cargarGrilla(opElegida);
            }
        }

        private void rdbAgendaPeriodo_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbAgendaPeriodo.Checked)
            {
                panelBusqueda.Enabled = true;
                opElegida = OpcionAgenda.Semana;
                //cargarGrilla(opElegida);
            }
        }
        #endregion

        private void grdAgenda_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.Orange)  //turno asignado
            {
                estadoTurnoSeleccionado = 2;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[e.RowIndex, e.ColumnIndex];


                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["asignarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarCobroToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarLlegadaToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["cancelarTurnoToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["enviarRecordatorioTurnoToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);

            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.Chocolate) //turno asistido sin cobrar
            {
                //MessageBox.Show("Turno registrado con llegada a " + nombrePaciente, "Aviso", MessageBoxButtons.OKCancel);
                estadoTurnoSeleccionado = 3;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[e.RowIndex, e.ColumnIndex];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;


                contextMenuStrip1.Items["asignarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarCobroToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["registrarLlegadaToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["cancelarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["enviarRecordatorioTurnoToolStripMenuItem"].Visible = false;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.White)  //turno disponible
            {
                estadoTurnoSeleccionado = 1;

                //tomamos el id del turno
                switch (opElegida)
                {
                    case OpcionAgenda.Hoy:
                        idTurnoSeleccionado = matrizIdTurnos[e.RowIndex, e.ColumnIndex];
                        break;
                    case OpcionAgenda.Semana:
                        idTurnoSeleccionado = matrizIdTurnosSemana[e.RowIndex, e.ColumnIndex];
                        break;
                    default:
                        break;
                }

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["asignarTurnoToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["registrarCobroToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarLlegadaToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["cancelarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["enviarRecordatorioTurnoToolStripMenuItem"].Visible = false;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.YellowGreen) //turno atendido sin cobrar
            {
                formCobroAtencion = new frmCobroAtencionMédica();
                estadoTurnoSeleccionado = 5;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[e.RowIndex, e.ColumnIndex];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["asignarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarCobroToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["registrarLlegadaToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["cancelarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["enviarRecordatorioTurnoToolStripMenuItem"].Visible = false;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
                //formCobroAtencion.setEstadoTurno(estadoTurnoSeleccionado);
                formCobroAtencion.SetFormGestionTurno(this);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.LightGray) //No disponible
            {
                MessageBox.Show("No hay turno para el dia y hora seleccionado para este doctor");
                //estadoTurnoSeleccionado = "No disponible";
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.LightCoral) //Asistido y cobrado
            {
                estadoTurnoSeleccionado = 6;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[e.RowIndex, e.ColumnIndex];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["asignarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarCobroToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarLlegadaToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["cancelarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["enviarRecordatorioTurnoToolStripMenuItem"].Visible = false;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.SeaGreen) //Atendido y cobrado
            {
                estadoTurnoSeleccionado = 6;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[e.RowIndex, e.ColumnIndex];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["asignarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarCobroToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["registrarLlegadaToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["cancelarTurnoToolStripMenuItem"].Visible = false;
                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                contextMenuStrip1.Items["enviarRecordatorioTurnoToolStripMenuItem"].Visible = false;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
        }

        #region MenuContextual

        private void registrarCobroToolStripMenuItem_Click(object sender, EventArgs e)
        {
            myFormHijoActual = FormsHijo.registrarCobro;
            frmCobroAtencionMédica formCobro = new frmCobroAtencionMédica();
            formCobro.MdiParent = this.MdiParent;
            formCobro.SetFormGestionTurno(this);
            formCobro.nroHCpaciente = nroHCturno;
            formCobro.idTurno = idTurnoSeleccionado;
            formCobro.Show();
        }

        private void asignarTurnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            myFormHijoActual = FormsHijo.asignarTurno;
            frmAsignarTurno formAsignarT = new frmAsignarTurno();
            formAsignarT.IdTurno = idTurnoSeleccionado;
            formAsignarT.tipo = 1;//Seleccionamos que el tipo es de turno.
            formAsignarT.MyFormPadre = this;
            formAsignarT.Show();
        }

        private void cancelarTurnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //dejamos la celda como disponible
            //guardar cambios en la bd
            grdAgenda.CurrentCell.Style.BackColor = Color.White;
        }

        private void registrarLlegadaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            myFormHijoActual = FormsHijo.registrarLlegada;
            frmRegistrarLlegadaTurno formLlegadaT = new frmRegistrarLlegadaTurno();
            formLlegadaT.setFormPadre(this);
            formLlegadaT.IdTurnoSeleccionado = idTurnoSeleccionado;
            formLlegadaT.Show();
        }

        private void verPacienteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //obtener nrohc paciente, pasarlo en el constructor del form
            frmMostrarDatosPaciente formDatosPaciente = new frmMostrarDatosPaciente(nroHCturno);
            formDatosPaciente.Show();
        }

        private void enviarRecordatorioTurnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //buscamos el numero de celular y se lo pasamos al form de enviar sms
            Pacientess pac = new Pacientess();
            long nroCelularPac = pac.obtenerCelularPaciente(nroHCturno);
            if (nroCelularPac == 0)
                MessageBox.Show("El paciente de este turno no tiene registrado un número de celular");
            else
            {
                frmEnviarSMS formSMS = new frmEnviarSMS();
                formSMS.nroCel = nroCelularPac;
                formSMS.idTurno = idTurnoSeleccionado;
                formSMS.Show();
            }
            
        }
        #endregion

        #endregion

        private void timer1_Tick(object sender, EventArgs e)
        {
            txtFechaHora.Text = DateTime.Now.ToString();

        }

        #region combos
        private void cargarComboEspecialidadesPorTurno()
        {
            if (cmbEspecialidadTurnos.Items.Count == 0)
            {
                List<Especialidad> listEspecialidades = GestorEspecialidades.obtenerEspecialidadesPorTurno();
                cmbEspecialidadTurnos.DataSource = listEspecialidades;
                cmbEspecialidadTurnos.ValueMember = "CodEspecialidad";
                cmbEspecialidadTurnos.DisplayMember = "Nombre";
                cmbEspecialidadTurnos.SelectedIndex = -1;
            }
        }

        private void cargarComboMedicosPorTurno()
        {
            GestorMedicos gm = new GestorMedicos();
            List<Medico> listaMedicos = gm.obtenerMedicosTurnos();
            cmbMedicoTurnos.DataSource = listaMedicos;
            cmbMedicoTurnos.ValueMember = "Legajo";
            cmbMedicoTurnos.DisplayMember = "ApellidoNombre";
            cmbMedicoTurnos.SelectedIndex = -1;
        }

        private void cargarComboEspecialidadesPorOrdenLlegada()
        {
            if (cmbEspecialidadOrdenLlegada.Items.Count == 0)
            {
                List<Especialidad> listEspecialidades = GestorEspecialidades.obtenerEspecialidadesPorOrdenLlegada();
                cmbEspecialidadOrdenLlegada.DataSource = listEspecialidades;
                cmbEspecialidadOrdenLlegada.ValueMember = "CodEspecialidad";
                cmbEspecialidadOrdenLlegada.DisplayMember = "Nombre";
                cmbEspecialidadTurnos.SelectedIndex = -1;
            }
        }

        private void cargarComboMedicosPorOrdenLlegada()
        {
            GestorMedicos gm = new GestorMedicos();
            List<Medico> listaMedicos = gm.obtenerMedicosOrdenLlegada();
            cmbMedicoOrdenLlegada.DataSource = listaMedicos;
            cmbMedicoOrdenLlegada.DisplayMember = "ApellidoNombre";
            cmbMedicoOrdenLlegada.ValueMember = "Legajo";
            cmbMedicoOrdenLlegada.SelectedIndex = -1;
        }

        private void cmbEspecialidadTurnos_SelectionChangeCommitted(object sender, EventArgs e)
        {
            //cargamos el combo del medico de acuerdo a la especialidad que se selecciono
            int idEspecialidadSeleccionada = int.Parse(cmbEspecialidadTurnos.SelectedValue.ToString());
            List<Medico> listaMedicosEsp = GestorEspecialidades.ObtenerMedicosDeEspecialidad(idEspecialidadSeleccionada);
            cmbMedicoTurnos.DataSource = listaMedicosEsp;
            cmbMedicoTurnos.ValueMember = "Legajo";
            cmbMedicoTurnos.DisplayMember = "ApellidoNombre";
            cmbMedicoTurnos.SelectedIndex = -1;
        }

        private void cmbEspecialidadOrdenLlegada_SelectionChangeCommitted(object sender, EventArgs e)
        {
            //cargamos el combo del medico de acuerdo a la especialidad que se selecciono
            int idEspecialidadSeleccionada = int.Parse(cmbEspecialidadOrdenLlegada.SelectedValue.ToString());
            List<Medico> listaMedicosEsp = GestorEspecialidades.ObtenerMedicosDeEspecialidad(idEspecialidadSeleccionada);
            cmbMedicoOrdenLlegada.DataSource = listaMedicosEsp;
            cmbMedicoOrdenLlegada.ValueMember = "Legajo";
            cmbMedicoOrdenLlegada.DisplayMember = "ApellidoNombre";
            cmbMedicoOrdenLlegada.SelectedIndex = -1;
        }
        #endregion


        #region TabListadoOrdenLlegada

        private void btnBuscarListadoOrdenLlegada_Click(object sender, EventArgs e)
        {
            if (cmbEspecialidadOrdenLlegada.SelectedIndex != -1)
            {
                if (cmbMedicoOrdenLlegada.SelectedIndex != -1)
                {
                    int codEsp = int.Parse(cmbEspecialidadOrdenLlegada.SelectedValue.ToString());
                    long legajo = long.Parse(cmbMedicoOrdenLlegada.SelectedValue.ToString());
                    DateTime fecha = DateTime.Now;
                    GestorListadosOrdenLlegada gl = new GestorListadosOrdenLlegada();
                    List<ItemListadoOrdenLlegada> listadoPacientes = gl.obtenerListado(codEsp, legajo, fecha);

                    grdListadoPacientes.Rows.Clear();
                    if (listadoPacientes != null)
                    {
                        foreach (ItemListadoOrdenLlegada item in listadoPacientes)
                        {
                            int i = grdListadoPacientes.Rows.Add();

                            grdListadoPacientes.Rows[i].Cells["Apellido"].Value = item.ApellidoNombrePaciente;
                            grdListadoPacientes.Rows[i].Cells["NroHC"].Value = item.nroHCpaciente;
                            grdListadoPacientes.Rows[i].Cells["Atendido"].Value = item.Atendido;
                            grdListadoPacientes.Rows[i].Cells["Cobrado"].Value = item.Cobrado;
                            grdListadoPacientes.Rows[i].Cells["horaLLegada"].Value = item.horaLLegada.ToString(@"hh\:mm");
                            grdListadoPacientes.Rows[i].Cells["idItem"].Value = item.idItemListado;
                        }
                    }
                    else
                    {
                        MessageBox.Show("no se encontraron resultados");
                    }
                }
                else
                {
                    MessageBox.Show("Tiene que seleccionar el medico", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
            }
            else
            {
                MessageBox.Show("Tiene que seleccionar la especialidad", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

        }


        private void btnRegistrarCobro_Click(object sender, EventArgs e)
        {
            if (grdListadoPacientes.CurrentRow.Cells["idItem"].ToString() != null)
            {
                frmCobroAtencionMedica2 frmCobro = new frmCobroAtencionMedica2();
                idItemOLL =long.Parse(grdListadoPacientes.CurrentRow.Cells["idItem"].Value.ToString());
                frmCobro.idListadoOLL = this.idItemOLL;
                frmCobro.Show();
            }
            else
            {
                MessageBox.Show("Seleccione una fila", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }


        private void btnAgregarPaciente_Click(object sender, EventArgs e)
        {
            if (cmbEspecialidadOrdenLlegada.SelectedIndex != -1)
            {
                if (cmbMedicoOrdenLlegada.SelectedIndex != -1)
                {
                    frmAsignarTurno frmAt = new frmAsignarTurno();
                    Especialidad oE = (Especialidad)cmbEspecialidadOrdenLlegada.SelectedItem;
                    Medico oM = (Medico)cmbMedicoOrdenLlegada.SelectedItem;
                    frmAt.nombreEspecialidad = oE.Nombre;
                    frmAt.nombreMedico = oM.ApellidoNombre;
                    frmAt.codEspecialidad = oE.CodEspecialidad;
                    frmAt.legajoMedico = oM.Legajo;
                    frmAt.tipo = 2;
                    frmAt.Owner = this;
                    frmAt.ShowDialog();
                }
                else
                {
                    MessageBox.Show("Tiene que seleccionar el medico", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }

            }
            else
            {
                MessageBox.Show("Tiene que seleccionar la especialidad", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

        }




        #endregion

        public void actualizarEstadoTurno()
        {
            Turno t = null;
            switch (myFormHijoActual)
            {
                case FormsHijo.asignarTurno:
                    //obtener nombre paciente
                    grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Style.BackColor = Color.Orange;
                    t = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado);
                    grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Value += " " + t.NombrePaciente;
                    break;
                case FormsHijo.registrarCobro:
                    //validar si el turno esta atendido o no
                    if (grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Style.BackColor == Color.YellowGreen)
                    {
                        grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Style.BackColor = Color.SeaGreen;
                        t = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado);
                        grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Value += " " + t.NombrePaciente;

                    }
                    if (grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Style.BackColor == Color.Chocolate)
                    {
                        grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Style.BackColor = Color.LightCoral;
                        t = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado);
                        grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Value += " " + t.NombrePaciente;

                    }
                    break;
                case FormsHijo.registrarLlegada:
                    switch (estadoTurnoSeleccionado)
                    {
                        case 3: //asistido NO cobrado
                            grdAgenda.Rows[nroFilaTurnoSeleccionado].Cells[nroColumnaSeleccionado].Style.BackColor = Color.Chocolate;
                            break;
                    }
                    break;
                default:
                    break;
            }
        }



        public void setFormPadre(Form formPadre)
        {
            throw new NotImplementedException();
        }

        public void setFormHijo(Form formHijo)
        {
            if (formHijo.GetType() == typeof(frmAsignarTurno))
                myFormHijoActual = FormsHijo.asignarTurno;
            if (formHijo.GetType() == typeof(frmAsignarTurno))
                myFormHijoActual = FormsHijo.registrarLlegada;


        }

        private void btnLlamadaEmergencia_Click(object sender, EventArgs e)
        {
            frmRegistrarLlamadaDeEmergencia formLlamadas = new frmRegistrarLlamadaDeEmergencia();
            formLlamadas.Show();
        }

        private void btnBuscarEspecialidad_Click(object sender, EventArgs e)
        {
            int codEspecialidad = int.Parse(cmbEspecialidadTurnos.SelectedValue.ToString());
            long legajo = long.Parse(cmbMedicoTurnos.SelectedValue.ToString());
            DateTime fechaDesde = dtpFechaDesde.Value;
            cargarGrillaSemana(codEspecialidad, legajo, fechaDesde);
        }



        #region Miembros de IListadoOrdenLLegada

        public void addItemLista(ItemListadoOrdenLlegada lsL)
        {
            grdListadoPacientes.Rows.Clear();
            GestorListadosOrdenLlegada gl = new GestorListadosOrdenLlegada();
            List<ItemListadoOrdenLlegada> listadoPacientes = gl.obtenerListado(lsL.IdEspecialidad, lsL.LegajoMedico, lsL.fechaListado);
            foreach (ItemListadoOrdenLlegada iL in listadoPacientes)
            {
                int i = grdListadoPacientes.Rows.Add();

                Especialidad oE = Especialidades.ObtenerEspecialidad(iL.IdEspecialidad);
                Pacientess oPS = new Pacientess();
                Paciente oP = oPS.buscarPaciente(iL.nroHCpaciente);
                grdListadoPacientes.Rows[i].Cells["Apellido"].Value = iL.ApellidoNombrePaciente;
                grdListadoPacientes.Rows[i].Cells["HoraLLegada"].Value = iL.horaLLegada.ToString(@"hh\:mm");
                grdListadoPacientes.Rows[i].Cells["NroHC"].Value = iL.nroHCpaciente;
                grdListadoPacientes.Rows[i].Cells["idItem"].Value = iL.idItemListado;
                if (iL.Atendido == false)
                {
                    grdListadoPacientes.Rows[i].Cells["Atendido"].Value = "No";
                }
                else
                {
                    grdListadoPacientes.Rows[i].Cells["Atendido"].Value = "Si";
                }
                if (iL.Cobrado == false)
                {
                    grdListadoPacientes.Rows[i].Cells["Cobrado"].Value = "No";
                }
                else
                {
                    grdListadoPacientes.Rows[i].Cells["Cobrado"].Value = "Si";
                }
            }

        }

        #endregion

        private void grdListadoPacientes_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (grdListadoPacientes.CurrentCell.OwningColumn == grdListadoPacientes.Columns["Eliminar"])
            {


                long nrHC = long.Parse(grdListadoPacientes.Rows[e.RowIndex].Cells["NroHC"].Value.ToString());
                TimeSpan hora = TimeSpan.Parse(grdListadoPacientes.Rows[e.RowIndex].Cells["horaLLegada"].Value.ToString());
                grdListadoPacientes.Rows.RemoveAt(e.RowIndex);
                if (ListadosOrdenLlegada.eliminarItemListado(nrHC, hora))
                {

                }
                else
                {
                    MessageBox.Show("Error al eliminar", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }


            }
        }

        private void tabPageTurnos_Click(object sender, EventArgs e)
        {

        }

        private void cmbEspecialidadTurnos_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }
}
